package modelo;

import java.util.Observable;
import java.util.concurrent.Semaphore;

public abstract class Bloque extends Observable {
	
	private Coordenada posicion;
	private Direccion sentido;
	private Semaphore mutex;
	private Auto auto;
	private Boolean interseccion;
	
	public Bloque(Direccion sentido, Coordenada posicion) {
		super();
		this.sentido = sentido;
		this.posicion = posicion;
		this.mutex = new Semaphore(1);
		this.interseccion = false;
	}
	
	public abstract void entrar(Auto auto);
		
	public abstract void liberar(Auto auto); 
	
	public synchronized void notificar() {
		this.notificar(null);
	}
	
	public synchronized void notificar(Object arg) {
		this.setChanged();
		this.notifyObservers(arg);
	}
	
	public Boolean estaOcupado() {
		return this.getAuto() != null;
	}

	public Boolean esDobleSentido() {
		return false;
	}
	
	public Boolean tieneSemaforo() {
		return false;
	}
	
	public Direccion getSegundoSentido() {
		return null;
	}
	
	//==== GETTERS Y SETTERS ====
	
	public Coordenada getPosicion() {
		return posicion;
	}
	
	public void setPosicion(Coordenada posicion) {
		this.posicion = posicion;
	}
	
	public Direccion getSentido() {
		return sentido;
	}
	
	public void setSentido(Direccion sentido) {
		this.sentido = sentido;
	}
	
	public Semaphore getMutex() {
		return mutex;
	}
	
	public void setMutex(Semaphore mutex) {
		this.mutex = mutex;
	}
	
	public Auto getAuto() {
		return auto;
	}
	
	public synchronized void setAuto(Auto auto) {
		this.auto = auto;
	}

	public Boolean getInterseccion() {
		return interseccion;
	}

	public void setInterseccion(Boolean interseccion) {
		this.interseccion = interseccion;
	}
}
